package com.atguigu.aclservice.helper;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.aclservice.entity.Permission;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 根据权限数据构建登录用户左侧菜单数据
 * </p>
 *
 * @author He Wentao
 * @since 2022/10/9 22:28
 */
public class MenuHelper {

    /**
     * 构建菜单
     * @param treeNodes 拼接好的 菜单栏 对象
     * @return 拼接好的菜单栏 JSON 数组
     */
    public static List<JSONObject> build(List<Permission> treeNodes) {

        // 创建一个集合，用于保存拼接结果
        List<JSONObject> menus = new ArrayList<>();

        // 判断传递过来的集合是否为 1
        if(treeNodes.size() == 1) {
            // 为 1 表示是拼接好的菜单栏对象，才能进行构建
            // 获取到开始 菜单栏
            Permission topNode = treeNodes.get(0);
            // 获取到一级菜单栏
            List<Permission> oneMenuList = topNode.getChildren();

            // 遍历一级菜单栏
            for(Permission one :oneMenuList) {
                // 创建 json Object
                JSONObject oneMenu = new JSONObject();
                // 设置属性 “path” 路径
                oneMenu.put("path", one.getPath());
                // 设置属性 “component” 注册的组件
                oneMenu.put("component", one.getComponent());
                // 设置属性 “redirect” 重定向路径，这里设置为不重定向
                if (one.getRedirect()!=null)oneMenu.put("redirect", one.getRedirect());
                // 设置属性 “name” 路由名称
                oneMenu.put("name", "name_"+one.getId());
                // 设置属性 “hidden” 不隐藏
                oneMenu.put("hidden", false);

                // 创建 JSON Object
                JSONObject oneMeta = new JSONObject();
                // 设置属性 “title” 菜单栏名称
                oneMeta.put("title", one.getName());
                // 设置属性 “icon” 菜单栏图标
                oneMeta.put("icon", one.getIcon());


                // 拼接到 最开始的 json Object 中去，名称为 meta
                oneMenu.put("meta", oneMeta);

                // 创建 JSON Object类型的 “子菜单栏集合”，用于存储 二级路由
                List<JSONObject> children = new ArrayList<>();

                // 获取到子菜单栏集合
                List<Permission> twoMeunList = one.getChildren();

                // 遍历二级子菜单栏集合
                for(Permission two :twoMeunList) {
                    // 创建 JSON Object
                    JSONObject twoMenu = new JSONObject();
                    // 设置属性 “path” 路径
                    twoMenu.put("path", two.getPath());
                    // 设置属性 “name” 路由名称
                    twoMenu.put("name", "name_"+two.getId());
                    // 设置属性 “component” 注册的组件，由于我们的二级路由中，是没有重定向的，所以不需要设置
                    twoMenu.put("component", two.getComponent());
                    // 设置属性 “hidden” 是否隐藏
                    twoMenu.put("hidden", two.getStatus());

                    // 创建 JSON Object
                    JSONObject twoMeta = new JSONObject();

                    // 设置属性 “title” 菜单栏名称
                    twoMeta.put("title", two.getName());
                    // 设置属性 “icon” 菜单栏图标
                    twoMeta.put("icon", two.getIcon());
                    // 设置属性 “activeMenu” 设置激活的菜单栏
                    twoMeta.put("activeMenu", two.getActiveMenu());

                    // 添加到 meta 属性中去
                    twoMenu.put("meta", twoMeta);

                    // 添加到 children 二级子路由集合中去
                    children.add(twoMenu);

                    // 获取子子菜单集合
                    List<Permission> threeMenuList = two.getChildren();

                    // 判断是否存在三级路由
                    if (threeMenuList!=null) {

                        // 遍历子子菜单集合
                        for(Permission three :threeMenuList) {
                            // 判断是否存在，没有直接跳过
                            if(StringUtils.isEmpty(three.getPath())) continue;

                            // 创建 JSON Object
                            JSONObject threeMenu = new JSONObject();

                            // 设置属性
                            threeMenu.put("path", three.getPath());
                            threeMenu.put("name", "name_"+three.getId());
                            threeMenu.put("component", three.getComponent());
                            threeMenu.put("hidden", three.getStatus());

                            JSONObject threeMeta = new JSONObject();
                            threeMeta.put("title", three.getName());
                            threeMeta.put("activeMenu", three.getActiveMenu());

                            threeMenu.put("meta", threeMeta);

                            // 添加到 children 二级子路由集合中去 , 这里是根据路由使用的格式，来进行配置的
                            // 如果你的路由是嵌套路由，就需要加到三级路由的子路由里面
                            // 我们这里使用的是另外一种路由模式，所以是直接加到 二级路由集合里面
                            children.add(threeMenu);
                        }
                    }
                }
                oneMenu.put("children", children);
                menus.add(oneMenu);
            }
        }
        return menus;
    }
}
